# 需求：使用‘注册A.html’页面，完成以下操作：
# 1).获取用户名输入框的大小
# 2).获取页面上第一个超链接的文本内容
# 3).获取页面上第一个超链接的地址
# 4).判断页面中的span标签是否可见
# 5).判断页面中取消按钮是否可用
# 6).判断页面中'旅游'对应的复选框是否为选中的状态

# 从time模块导入sleep函数，用于程序强制暂停（简化写法，仅使用sleep功能）
from time import sleep
# 从selenium库导入webdriver模块，核心用于创建浏览器驱动、控制浏览器行为
from selenium import webdriver
# 从selenium驱动模块导入By类，用于规范元素定位方式（selenium4+推荐，替代旧版find_element_by_*）
from selenium.webdriver.common.by import By

# 1. 初始化并打开Chrome浏览器
# executable_path：指定ChromeDriver驱动的本地绝对路径（适配selenium3及以下版本，需手动下载对应驱动）
# 驱动作用：作为Python代码与Chrome浏览器的通信桥梁，实现对浏览器的控制
driver = webdriver.Chrome(executable_path='D:/chrome_driver/chromedriver.exe')
# 注释：selenium4及以上版本推荐写法（无需手动指定驱动路径）
# 需提前安装 webdriver-manager 库（pip install webdriver-manager），会自动匹配浏览器版本下载驱动
# driver = webdriver.Chrome() # 创建Chrome浏览器对象，后续通过该对象执行所有操作

# 2. 访问目标页面（注册A页面）
# get()方法：接收完整URL参数，让浏览器加载并显示该URL对应的网页
# 注意：URL必须包含http/https协议，否则会被识别为本地文件路径
driver.get("http://121.43.169.97:8848/pageA.html")

# 放大浏览器窗口
# maximize_window()：将浏览器窗口调整为当前屏幕的最大尺寸
# 作用：避免因窗口过小导致部分元素被隐藏（影响定位），同时保证元素布局稳定，提高脚本兼容性
driver.maximize_window()

# 3. 核心操作1：获取用户名输入框的大小
# 定位用户名输入框：通过CSS_SELECTOR定位id为"userA"的元素（#表示id选择器，等价于By.ID定位）
# size属性：返回元素的尺寸字典，包含width（宽度）和height（高度）两个键，值为像素数
size = driver.find_element(By.CSS_SELECTOR,"#userA").size
# 打印结果：输出输入框的宽高信息（如{'width': 200, 'height': 30}）
print("用户名输入框的大小为：", size)

# 4. 核心操作2：获取页面上第一个超链接的文本内容
# 定位第一个超链接：通过CSS_SELECTOR定位"a"标签（页面中所有<a>标签是超链接，find_element默认返回第一个匹配元素）
# text属性：返回元素的可见文本内容（超链接的显示文字，如"百度"）
text = driver.find_element(By.CSS_SELECTOR, "a").text
# 打印结果：输出第一个超链接的显示文本
print("页面上第一个超链接的文本内容为：", text)

# 5. 核心操作3：获取页面上第一个超链接的地址
# 重新定位第一个超链接（与步骤4定位对象一致）
# get_attribute("href")：获取元素的指定属性值，此处获取"href"属性（超链接的目标URL）
href = driver.find_element(By.CSS_SELECTOR, "a").get_attribute("href")
# 打印结果：输出超链接的完整URL（如"https://www.baidu.com"）
print("页面上第一个超链接的地址为：", href)

# 6. 核心操作4：判断页面中的span标签是否可见
# 定位span标签：通过CSS_SELECTOR定位"span"标签（默认返回页面中第一个span元素）
# is_displayed()方法：返回布尔值（True/False），True表示元素在页面上可见，False表示隐藏（如display: none）
span_visible = driver.find_element(By.CSS_SELECTOR, "span").is_displayed()
# 打印结果：输出span标签的可见状态
print("页面中第一个span标签是否可见：", span_visible)

# 7. 核心操作5：判断页面中取消按钮是否可用
# 定位取消按钮：通过CSS_SELECTOR定位id为"cancelA"的按钮（#表示id选择器，假设取消按钮的id为cancelA）
# is_enabled()方法：返回布尔值（True/False），True表示元素可交互（如按钮可点击、输入框可输入），False表示禁用
cancel_enabled = driver.find_element(By.CSS_SELECTOR, "#cancelA").is_enabled()
# 打印结果：输出取消按钮的可用状态
print("页面中取消按钮是否可用：", cancel_enabled)

# 8. 核心操作6：判断页面中'旅游'对应的复选框是否为选中状态
# 定位"旅游"复选框：通过CSS_SELECTOR定位id为"lyA"的复选框（假设旅游复选框的id为lyA，与需求对应）
# is_selected()方法：返回布尔值（True/False），仅适用于复选框、单选框、下拉框选项，True表示已选中，False表示未选中
travel_checked = driver.find_element(By.CSS_SELECTOR, "#lyA").is_selected()
# 打印结果：输出旅游复选框的选中状态
print("页面中'旅游'对应的复选框是否选中：", travel_checked)

# 额外操作：点击"音乐"对应的复选框，使其选中
# 定位"音乐"复选框：通过CSS_SELECTOR定位id为"yyA"的复选框（假设音乐复选框的id为yyA）
# click()方法：对元素执行点击操作（复选框点击后会切换选中/未选中状态）
driver.find_element(By.CSS_SELECTOR, "#yyA").click()

# 9. 关闭浏览器：间隔3秒后执行，确保所有操作已完成
# 强制暂停3秒：等待额外操作（点击音乐复选框）生效，避免提前关闭浏览器导致操作未执行
sleep(3)

# 关闭浏览器并释放资源
# quit()方法：关闭所有由当前驱动打开的浏览器窗口，并终止驱动进程（彻底释放内存和端口资源，推荐使用）
# 区别于close()：close()仅关闭当前聚焦的窗口，驱动进程可能残留
driver.quit()